#ifndef __CROWN_BAR_CODE_H__
#define __CROWN_BAR_CODE_H__

#ifdef __cplusplus
extern "C" {
#endif


#ifndef NO_ERROR
#define NO_ERROR 0
#endif

#define ERR_SCANNER_NO_ERROR    0     /** NO ERROR**/
#define ERR_SCANNER_OPEN       -10400 /** 打开扫码模块失败 **/
#define ERR_SCANNER_READ       -10401 /** 读取数据失败     **/
#define ERR_SCANNER_NOINIT     -10404 /** 设备未初始化     **/
#define ERR_SCANNER_OTHER      -10499 /** 扫码模块其他错误 **/

/**
 * res 扫码结果(0表示成功,1表示结束，其他错误),
 * code 扫码内容
 * udata 用户数据
 */
typedef void (*BarcodeScanCallback)(int res, const char *code, void *udata);


/**
 * 功 能：获取扫码接口库软件版本号 
 * 入口参数：无 
 * 出口参数：swInfo — 版本号 
 * 返 回 值：NO_ERROR — 成功 
 * 其他 — 错误，并指出错误状态
 **/
int BarcodeGetSoftwareInfo(char* swInfo);

/**
 * 功 能：获取扫码模块的硬件信息 
 * 入口参数：无 
 * 出口参数：hwInfo — 硬件信息，最多1024个字符（包含结束符\0）。应包含如下信息：硬件厂商名|硬件型号|硬件版本|固件版本|生产日期|硬件序列号| 
 * 返 回 值：NO_ERROR — 成功 
 * 其他 — 错误，并指出错误状态
**/
int BarcodeGetHardwareInfo(char* hwInfo);

/**
 * 功 能：设置cfg配置文件日志级别并立即生效。默认是1，上层应用可根情况，设置日志级别。 
 * 入口参数：level — 日志级别（0—关闭；1—错误；2—调试） 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功 
 * 其他 — 错误，并指出错误状态
**/
int BarcodeSetLogLevel(int level);

/**
 *功 能：获取扫描模块日志级别 
 *入口参数：无 
 *出口参数：无 
 *返 回 值：>=0 — 日志级别（0—关闭；1—错误；2—调试） 
 *其他 — 错误，并指出错误状态
**/
int BarcodeGetLogLevel(void);

/**
 * 功 能：获取最近一次错误码 
 * 入口参数：无 
 * 出口参数：无 
 * 返 回 值：错误码
**/
int BarcodeGetLastErrorCode(void);

/**
 *功 能：获取上次错误描述 
 *入口参数：errmsg — 错误缓冲区，1024字节，传入前已初始化 
 *出口参数：errmsg — 错误描述 
 *返 回 值：NO_ERROR — 成功 
 *其他 — 错误，并指出错误状态
**/
int BarcodeGetLastErrString(char* errmsg);

/**
 * 功 能：获取错误码对应错误描述 
 * 入口参数：errCode — 错误码 
 * 出口参数：无 
 * 返 回 值：错误描述
 **/
const char* BarcodeGetErrorStr(int errCode);

/**
 * 功 能：初始化扫描模块 
 * 入口参数：无 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功
 * 其他 — 错误，并指出错误状态
 **/
int BarcodeInit(void);

/**
 * 功 能：扫码模块状态查询,判断扫码设备是否正常 
 * 入口参数：无 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功-设备正常 
 * 其他 — 错误，并指出错误状态
**/
int BarcodeStatus(void);


/**
 * 功 能：读取扫描枪数据 
 * 入口参数：timeout — 扫描枪扫描超时时间，单位毫秒 
 * 出口参数：code — 保存扫描枪读取到的数据，必须以\n结尾 
 * len — 扫描数据的长度 
 * 返 回 值：NO_ERROR — 成功 
 * 其他 — 错误，并指出错误状态
 **/
int BarcodeRead(char* code, int *len, int timeout);

int BarcodeReadCancelAble(char* code, int *len, int timeout, int *pt_cancel);

/**
功 能：获取扫描枪句柄描述符（设置成虚拟串口时提供），探测多个设备是否有数据时使用 
入口参数：无 
出口参数：无 
返 回 值：>0 — 返回扫描枪的句柄 
其他 — 错误，并指出错误状态
**/
int BarcodeGetFd(void);

/** 
 * 功 能：关闭扫描枪句柄描述符 
 * 入口参数：无 
 * 出口参数：无 
 * 返 回 值：无
 */
void BarcodeClose(void);

/**
 * 功 能：初始化扫码模块 
 * 入口参数：cfgPath — 配置文件路径 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功 
 * 其他 — 错误，并指出错误状态
**/
int BarcodeInitEx(const char *cfgPath);

int BarcodeInitExByPortName(const char *cfgPath, const char *port_name);

/**
 * 功 能：启动自动扫码 
 * 入口参数：cb — 扫码成功回调函数void (*BarcodeScanCallback)(int res, const char *code, void *udata), 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功
 * 其他 — 错误，并指出错误状态
**/
int BarcodeScanStart(BarcodeScanCallback cb, void *udata);



/** 
 * 功 能：停止自动扫码 
 * 入口参数：无 
 * 出口参数：无 
 * 返 回 值：NO_ERROR — 成功 
 *其他 — 错误，并指出错误状态
**/
int BarcodeScanStop(void);




#ifdef __cplusplus
}
#endif

#endif
